﻿
namespace SistemaLogistica.DataAccess
{
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Common;
    using SistemaLogistica.Business.Entities;

    public class BienData : BaseDataAccess
    {
        private BienData() { }

        private readonly static BienData instancia = new BienData();

        public static BienData Instancia
        {
            get { return instancia; }
        }

        public List<Bien> Listar()
        {
            List<Bien> bienes = new List<Bien>();
            DbCommand command = db.GetStoredProcCommand("GetAllFromBien");
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    bienes.Add(new Bien
                    {
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Nombre = dr.GetString(dr.GetOrdinal("Nombre")),
                        StockActual = dr.GetDecimal(dr.GetOrdinal("StockActual")),
                        StockMinimo = dr.IsDBNull(dr.GetOrdinal("StockMinimo")) ? 0 : dr.GetDecimal(dr.GetOrdinal("StockMinimo")),
                        Descripcion = dr.GetString(dr.GetOrdinal("Descripcion")),
                        Estado = dr.GetInt32(dr.GetOrdinal("Estado")),
                        UnidadMedidia = UnidadMedidiaData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdUnidadMedida"))),
                        Precio = dr.GetDecimal(dr.GetOrdinal("Precio"))
                    });
                }
            }
            return bienes;
        }

        public List<Bien> Buscar(string nombre)
        {
            List<Bien> bienes = new List<Bien>();
            DbCommand command = db.GetStoredProcCommand("GetBienByKeyWord");
            db.AddInParameter(command, "nombre", DbType.String, nombre);
            
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    bienes.Add(new Bien
                    {
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Nombre = dr.GetString(dr.GetOrdinal("Nombre")),
                        StockActual = dr.GetDecimal(dr.GetOrdinal("StockActual")),
                        StockMinimo = dr.IsDBNull(dr.GetOrdinal("StockMinimo")) ? 0 : dr.GetDecimal(dr.GetOrdinal("StockMinimo")),
                        Descripcion = dr.GetString(dr.GetOrdinal("Descripcion")),
                        Estado = dr.GetInt32(dr.GetOrdinal("Estado")),
                        UnidadMedidia = UnidadMedidiaData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdUnidadMedida"))),
                        Precio = dr.GetDecimal(dr.GetOrdinal("Precio"))
                    });
                }
            }
            return bienes;
        }

        public Bien ObtenerPorID(int idBien)
        {
            Bien bien = null;
            DbCommand command = db.GetStoredProcCommand("GetBienByID");
            db.AddInParameter(command, "id", DbType.Int32, idBien);

            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    bien = new Bien
                    {
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Nombre = dr.GetString(dr.GetOrdinal("Nombre")),
                        StockActual = dr.GetDecimal(dr.GetOrdinal("StockActual")),
                        StockMinimo = dr.IsDBNull(dr.GetOrdinal("StockMinimo")) ? 0 : dr.GetDecimal(dr.GetOrdinal("StockMinimo")),
                        Descripcion = dr.GetString(dr.GetOrdinal("Descripcion")),
                        Estado = dr.GetInt32(dr.GetOrdinal("Estado")),
                        UnidadMedidia = UnidadMedidiaData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdUnidadMedida"))),
                        Precio = dr.GetDecimal(dr.GetOrdinal("Precio"))
                    };
                }
            }
            return bien;
        }

        public Bien ObtenerPorNombre(string nombre)
        {
            Bien bien = null;
            DbCommand command = db.GetStoredProcCommand("GetBienByNombre");
            db.AddInParameter(command, "nombre", DbType.String, nombre);

            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    bien = new Bien
                    {
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Nombre = dr.GetString(dr.GetOrdinal("Nombre")),
                        StockActual = dr.GetDecimal(dr.GetOrdinal("StockActual")),
                        StockMinimo = dr.IsDBNull(dr.GetOrdinal("StockMinimo")) ? 0 : dr.GetDecimal(dr.GetOrdinal("StockMinimo")),
                        Descripcion = dr.GetString(dr.GetOrdinal("Descripcion")),
                        Estado = dr.GetInt32(dr.GetOrdinal("Estado")),
                        UnidadMedidia = UnidadMedidiaData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdUnidadMedida"))),
                        Precio = dr.GetDecimal(dr.GetOrdinal("Precio"))
                    };
                }
            }
            return bien;
        }

        public int Agregar(Bien bien)
        {
            DbCommand command = db.GetStoredProcCommand("InsertBien");
            db.AddInParameter(command, "descripcion", DbType.String,bien.Descripcion);
            db.AddInParameter(command, "estado", DbType.Int32,bien.Estado);
            db.AddInParameter(command, "stockActual", DbType.Decimal,bien.StockActual);
            db.AddInParameter(command, "stockMinimo", DbType.Decimal,bien.StockMinimo);
            db.AddInParameter(command, "idUnidadMedida", DbType.Int32,bien.UnidadMedidia.IdUnidadMedida);
            db.AddOutParameter(command, "idBien", DbType.Int32, 11);
            db.AddInParameter(command, "nombre", DbType.String, bien.Nombre);
            db.AddInParameter(command, "precio", DbType.Currency,bien.Precio);

            int result = db.ExecuteNonQuery(command);

            if (result != 0) return 1;
            else return 0;
        }

        public void Modificar(Bien bien)
        {
            DbCommand command = db.GetStoredProcCommand("UpdateBien");
            db.AddInParameter(command, "descripcion", DbType.String, bien.Descripcion);
            db.AddInParameter(command, "estado", DbType.Int32, bien.Estado);
            db.AddInParameter(command, "stockActual", DbType.Decimal, bien.StockActual);
            db.AddInParameter(command, "stockMinimo", DbType.Decimal, bien.StockMinimo);
            db.AddInParameter(command, "idUnidadMedida", DbType.Int32, bien.UnidadMedidia.IdUnidadMedida);
            db.AddInParameter(command, "idBien", DbType.Int16,bien.IdBien);
            db.AddInParameter(command, "nombre", DbType.String, bien.Nombre);
            db.AddInParameter(command, "precio", DbType.Currency, bien.Precio);

            int result = db.ExecuteNonQuery(command);
        }

        public void Eliminar(int idBien)
        {
            DbCommand command = db.GetStoredProcCommand("DeleteBien");
            db.AddInParameter(command, "idBien", DbType.Int32, idBien);
            db.ExecuteNonQuery(command);
        }
    }
}
